📄 XML - eXtensible Markup Language

Guida completa dal livello base agli argomenti avanzati

📚 Cos'è XML?

XML (eXtensible Markup Language) è un linguaggio di markup progettato per memorizzare e trasportare dati in modo strutturato, leggibile sia dalle macchine che dagli esseri umani.

🎯 Caratteristiche Principali
  • eXtensible: puoi creare i tuoi tag personalizzati
  • Self-descriptive: i dati descrivono se stessi
  • Text-based: completamente in formato testo
  • Platform-independent: funziona su qualsiasi sistema
  • Standard W3C: riconosciuto universalmente

XML vs HTML: Qual è la Differenza?

Caratteristica XML HTML
Scopo Memorizzare e trasportare dati Visualizzare dati
Tag Definiti dall'utente (estensibili) Predefiniti (es. <p>, <div>)
Sintassi Molto rigorosa (case-sensitive) Più permissiva
Focus Struttura e significato dei dati Presentazione dei dati
Chiusura tag SEMPRE obbligatoria A volte opzionale
💡 Quando Usare XML?

XML è ideale per:

  • Scambio di dati tra sistemi diversi
  • File di configurazione
  • Documenti strutturati complessi
  • Web services (SOAP)
  • Feed RSS
  • Formati di file (Microsoft Office, SVG, Android layouts)

🏗️ Struttura Base di un Documento XML

Il Primo Documento XML

Esempio 1: XML Semplicissimo
<?xml version="1.0" encoding="UTF-8"?> <messaggio> Ciao, mondo! </messaggio>

Analisi:

  • Riga 1: Dichiarazione XML (versione e codifica)
  • Riga 2: Tag di apertura <messaggio>
  • Riga 3: Contenuto testuale
  • Riga 4: Tag di chiusura </messaggio>

Componenti di un Documento XML

1️⃣ Dichiarazione XML (Prolog)

<?xml version="1.0" encoding="UTF-8"?>

Opzionale ma raccomandato. Specifica:

  • version: versione XML (1.0 o 1.1)
  • encoding: codifica caratteri (UTF-8, ISO-8859-1...)
  • standalone: se il documento è autonomo (yes/no)

2️⃣ Elemento Radice (Root)

<biblioteca> <!-- tutto qui dentro --> </biblioteca>

OBBLIGATORIO. Ogni documento XML deve avere UN SOLO elemento radice che contiene tutti gli altri elementi.

3️⃣ Elementi (Tag)

<libro> <titolo>1984</titolo> <autore>Orwell</autore> </libro>

Gli elementi sono i mattoni di XML. Possono contenere:

  • Testo
  • Altri elementi (nidificati)
  • Attributi
  • Una combinazione di questi

4️⃣ Attributi

<libro isbn="978-0451524935" lingua="it"> ... </libro>

Gli attributi forniscono informazioni aggiuntive sull'elemento. Sono sempre coppie nome="valore".

5️⃣ Commenti

<!-- Questo è un commento --> <!-- I commenti possono estendersi su più righe -->

I commenti sono ignorati dal parser XML. Utili per documentare il codice.

6️⃣ CDATA

<codice> <![CDATA[ if (x < 10 && y > 5) { alert("Ok!"); } ]]> </codice>

CDATA permette di inserire testo con caratteri speciali (<, >, &) senza doverli escape.

📏 Regole di Sintassi XML

⚠️ XML è MOLTO Rigoroso!

A differenza di HTML, XML non perdona errori. Un singolo errore di sintassi rende l'intero documento non valido. Il parser si ferma immediatamente.

Le 10 Regole Fondamentali

✅ CORRETTO

<!-- 1. Tag sempre chiusi --> <nome>Mario</nome> <!-- 2. Tag vuoti con / --> <lineaVuota /> <!-- 3. Case-sensitive --> <Persona> </Persona> <!-- 4. Nidificazione corretta --> <a><b>testo</b></a> <!-- 5. Attributi tra virgolette --> <libro titolo="1984">

❌ SBAGLIATO

<!-- 1. Tag non chiuso --> <nome>Mario <!-- 2. Tag vuoto senza / --> <lineaVuota> <!-- 3. Case diverso --> <Persona> </persona> <!-- 4. Nidificazione errata --> <a><b>testo</a></b> <!-- 5. Virgolette mancanti --> <libro titolo=1984>
📋 Lista Completa delle Regole
  1. Un solo elemento radice: tutto il contenuto deve essere dentro un unico tag root
  2. Tutti i tag devono essere chiusi: <tag>...</tag> oppure <tag />
  3. Case-sensitive: <Libro> e <libro> sono TAG DIVERSI
  4. Nidificazione corretta: se apri A poi B, devi chiudere prima B poi A
  5. Attributi tra virgolette: sempre usare " o ' per i valori degli attributi
  6. Caratteri speciali escaped: < = &lt;, > = &gt;, & = &amp;, " = &quot;, ' = &apos;
  7. Nomi validi: i nomi possono contenere lettere, numeri, punti, trattini, underscore ma NON spazi
  8. Non iniziare con xml: i nomi che iniziano con "xml" (qualsiasi maiuscola/minuscola) sono riservati
  9. Spazi bianchi preservati: gli spazi all'interno del testo sono mantenuti
  10. Commenti non nidificati: non puoi mettere un commento dentro un altro commento

Entità e Caratteri Speciali

In XML, alcuni caratteri hanno un significato speciale e devono essere "escaped" usando entità:

Carattere Entità Descrizione Esempio
< &lt; Less than (minore di) 5 &lt; 10
> &gt; Greater than (maggiore di) 10 &gt; 5
& &amp; Ampersand (e commerciale) HTML &amp; CSS
" &quot; Virgolette doppie title=&quot;ok&quot;
' &apos; Apostrofo/virgoletta singola It&apos;s ok

📚 Esempi Progressivi

Livello 1: Libro Singolo
<?xml version="1.0" encoding="UTF-8"?> <libro> <titolo>Il Signore degli Anelli</titolo> <autore>J.R.R. Tolkien</autore> <anno>1954</anno> <genere>Fantasy</genere> </libro>
Struttura ad albero:
libro (radice)
├── titolo: "Il Signore degli Anelli"
├── autore: "J.R.R. Tolkien"
├── anno: "1954"
└── genere: "Fantasy"
Livello 2: Biblioteca con Più Libri
<?xml version="1.0" encoding="UTF-8"?> <biblioteca> <libro id="1"> <titolo>1984</titolo> <autore>George Orwell</autore> <anno>1949</anno> <disponibile>true</disponibile> </libro> <libro id="2"> <titolo>Il Nome della Rosa</titolo> <autore>Umberto Eco</autore> <anno>1980</anno> <disponibile>false</disponibile> </libro> <libro id="3"> <titolo>Il Piccolo Principe</titolo> <autore>Antoine de Saint-Exupéry</autore> <anno>1943</anno> <disponibile>true</disponibile> </libro> </biblioteca>
Livello 3: Struttura Complessa con Nidificazione
<?xml version="1.0" encoding="UTF-8"?> <azienda nome="TechCorp" fondazione="2010"> <dipendenti> <dipendente id="E001" reparto="IT"> <nome>Mario</nome> <cognome>Rossi</cognome> <ruolo>Senior Developer</ruolo> <contatti> <email>mario.rossi@techcorp.com</email> <telefono tipo="mobile">+39 333 1234567</telefono> </contatti> <competenze> <competenza livello="expert">Java</competenza> <competenza livello="advanced">Python</competenza> <competenza livello="intermediate">JavaScript</competenza> </competenze> </dipendente> <dipendente id="E002" reparto="HR"> <nome>Laura</nome> <cognome>Bianchi</cognome> <ruolo>HR Manager</ruolo> <contatti> <email>laura.bianchi@techcorp.com</email> <telefono tipo="ufficio">+39 02 12345678</telefono> </contatti> </dipendente> </dipendenti> </azienda>
Struttura gerarchica:
azienda [nome="TechCorp", fondazione="2010"]
└── dipendenti
├── dipendente [id="E001", reparto="IT"]
│ ├── nome: "Mario"
│ ├── cognome: "Rossi"
│ ├── ruolo: "Senior Developer"
│ ├── contatti
│ │ ├── email
│ │ └── telefono
│ └── competenze
│ ├── competenza (Java)
│ ├── competenza (Python)
│ └── competenza (JavaScript)
└── dipendente [id="E002", reparto="HR"]
└── ...

🤔 Attributi vs Elementi: Quando Usare Cosa?

Uno dei dilemmi più comuni in XML: quando usare un attributo e quando usare un elemento?

📋 Usando Elementi

<persona> <nome>Mario</nome> <cognome>Rossi</cognome> <eta>30</eta> </persona>

🏷️ Usando Attributi

<persona nome="Mario" cognome="Rossi" eta="30" />
🎯 Linee Guida

USA GLI ATTRIBUTI per:

  • Metadati (ID, versione, tipo, stato)
  • Valori semplici e singoli
  • Informazioni che non hanno una struttura interna
  • Dati che non cambiano frequentemente

USA GLI ELEMENTI per:

  • Dati complessi che possono contenere altri elementi
  • Valori che possono ripetersi
  • Testo lungo o multilinea
  • Dati che potrebbero avere una struttura futura
  • Quando vuoi più leggibilità
Esempio Pratico: Mix di Attributi ed Elementi
<prodotto id="P123" categoria="Elettronica"> <!-- Metadati come attributi --> <nome>Smartphone XYZ</nome> <descrizione> Smartphone di ultima generazione con fotocamera da 48MP e batteria da 5000mAh. </descrizione> <!-- Dati complessi come elementi --> <prezzo valuta="EUR">499.99</prezzo> <specifiche> <ram>8GB</ram> <storage>128GB</storage> <schermo>6.5 pollici AMOLED</schermo> </specifiche> </prodotto>

🌐 Namespace XML

I namespace (spazi dei nomi) permettono di evitare conflitti quando si usano elementi con lo stesso nome ma provenienti da vocabolari diversi.

🤔 Il Problema

Immagina di avere due vocabolari XML diversi che usano entrambi un tag <titolo>:

  • Uno per i libri (titolo del libro)
  • Uno per le persone (titolo professionale: Dott., Ing., Prof.)

Come fa il parser a distinguerli? Soluzione: Namespace!

Sintassi dei Namespace

Esempio: Definire e Usare i Namespace
<?xml version="1.0" encoding="UTF-8"?> <root xmlns:libro="http://esempio.com/biblioteca" xmlns:persona="http://esempio.com/persone"> <libro:titolo>1984</libro:titolo> <libro:autore>George Orwell</libro:autore> <persona:nome>Mario Rossi</persona:nome> <persona:titolo>Dott.</persona:titolo> </root>

Spiegazione:

  • xmlns:libro definisce il prefisso "libro" per il namespace
  • xmlns:persona definisce il prefisso "persona"
  • Gli URI sono solo identificatori univoci, non devono esistere realmente
  • Ora libro:titolo e persona:titolo sono distinti!

Namespace Predefinito

Namespace Senza Prefisso
<libro xmlns="http://esempio.com/biblioteca"> <!-- Tutti questi elementi appartengono al namespace predefinito --> <titolo>1984</titolo> <autore>George Orwell</autore> </libro>

✅ XML Ben Formato vs XML Valido

📝 XML Ben Formato (Well-Formed)

Un documento XML è ben formato se:

  • Rispetta tutte le regole di sintassi XML
  • Ha un elemento radice
  • Tutti i tag sono chiusi correttamente
  • Gli attributi sono tra virgolette
  • La nidificazione è corretta

✅ Tutti i documenti XML DEVONO essere ben formati

🎯 XML Valido (Valid)

Un documento XML è valido se:

  • È ben formato (prerequisito)
  • Rispetta una struttura definita (schema)
  • Usa solo elementi e attributi permessi
  • Rispetta l'ordine e il numero di elementi

💡 La validazione è OPZIONALE ma consigliata

DTD - Document Type Definition

Il DTD è il metodo "classico" per definire la struttura di un documento XML.

Esempio: DTD Interno
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE biblioteca [ <!ELEMENT biblioteca (libro+)> <!ELEMENT libro (titolo, autore, anno)> <!ELEMENT titolo (#PCDATA)> <!ELEMENT autore (#PCDATA)> <!ELEMENT anno (#PCDATA)> <!ATTLIST libro id ID #REQUIRED> ]> <biblioteca> <libro id="L1"> <titolo>1984</titolo> <autore>George Orwell</autore> <anno>1949</anno> </libro> </biblioteca>

Spiegazione DTD:

  • (libro+) = uno o più elementi libro
  • (titolo, autore, anno) = questi elementi in questo ordine
  • #PCDATA = Parsed Character Data (testo normale)
  • ID #REQUIRED = attributo id obbligatorio e univoco

⚔️ XML vs JSON

Oggi JSON (JavaScript Object Notation) è spesso preferito a XML per lo scambio di dati, soprattutto nelle API web moderne. Vediamo le differenze:

📄 XML

<persona> <nome>Mario</nome> <cognome>Rossi</cognome> <eta>30</eta> <hobby> <hobby>Calcio</hobby> <hobby>Lettura</hobby> </hobby> </persona>

📏 Dimensione: ~160 caratteri

📋 JSON

{ "nome": "Mario", "cognome": "Rossi", "eta": 30, "hobby": [ "Calcio", "Lettura" ] }

📏 Dimensione: ~90 caratteri (45% più piccolo!)

Criterio XML JSON
Leggibilità Verboso ma chiaro Più conciso
Dimensione Più grande (30-50% in più) Più compatto
Parsing Più lento Più veloce
Tipi di dati Solo stringhe (tutto è testo) Stringhe, numeri, booleani, null, array, oggetti
Attributi Supportati Non esistono
Namespace Supportati Non supportati
Commenti Supportati Non supportati (ufficialmente)
Validazione DTD, XSD, Schema avanzati JSON Schema (meno potente)
Uso principale Documenti complessi, config, SOAP API REST, JavaScript, web moderno
🎯 Quando Usare XML vs JSON?

USA XML quando:

  • Hai bisogno di documenti complessi con struttura mista
  • Devi usare namespace
  • Ti serve validazione rigorosa con schemi complessi
  • Lavori con sistemi legacy o SOAP
  • Gli attributi sono importanti per la tua struttura dati
  • Serve supporto per commenti dettagliati

USA JSON quando:

  • Stai costruendo API REST moderne
  • Lavori principalmente con JavaScript
  • La performance e la dimensione sono critiche
  • Hai dati con struttura semplice/media
  • Vuoi sintassi più leggera e veloce da parsare

🌍 Casi d'Uso Reali di XML

📰 RSS Feed

<rss version="2.0"> <channel> <title>Notizie Tech</title> <link>https://...</link> <item> <title>Nuovo AI</title> <pubDate>...</pubDate> </item> </channel> </rss>

I feed RSS usano XML per distribuire contenuti da blog e siti web.

🎨 SVG (Scalable Vector Graphics)

<svg width="100" height="100"> <circle cx="50" cy="50" r="40" fill="blue" /> </svg>

SVG usa XML per definire grafica vettoriale scalabile.

🤖 Android Layout

<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:text="Hello!" /> </LinearLayout>

Android usa XML per definire le interfacce utente.

⚙️ File di Configurazione

<configuration> <appSettings> <add key="DB_Host" value="localhost" /> </appSettings> </configuration>

Molte applicazioni usano XML per memorizzare configurazioni.

📝 Microsoft Office

I file .docx, .xlsx, .pptx sono in realtà archivi ZIP contenenti file XML!

Prova a rinominare un file .docx in .zip e aprirlo: vedrai cartelle piene di file XML che descrivono il documento.

🌐 SOAP Web Services

<soap:Envelope> <soap:Body> <GetPrice> <Item>Laptop</Item> </GetPrice> </soap:Body> </soap:Envelope>

SOAP usa XML per la comunicazione tra web services.

✏️ Editor XML Interattivo

Prova a Scrivere XML!

Scrivi o modifica il codice XML qui sotto e clicca "Valida" per verificare se è ben formato:

🎯 Esercizi Pratici

Esercizio 1: Crea un Menu di Ristorante

Compito: Crea un documento XML che rappresenti il menu di un ristorante con:

  • Almeno 3 piatti
  • Ogni piatto deve avere: nome, descrizione, prezzo, categoria (antipasto/primo/secondo/dolce)
  • Usa attributi per ID e categoria
  • Usa elementi per il resto
Esercizio 2: Playlist Musicale

Compito: Crea un documento XML per una playlist musicale con:

  • Nome della playlist
  • Almeno 5 canzoni
  • Ogni canzone: titolo, artista, album, durata, anno
  • Aggiungi un attributo "preferita" (true/false) ad alcune canzoni

🎓 Riepilogo Finale

📌 Punti Chiave da Ricordare

1. Cos'è XML:

  • Linguaggio di markup per memorizzare e trasportare dati
  • Estensibile: puoi creare i tuoi tag
  • Text-based e platform-independent

2. Regole di Sintassi:

  • UN SOLO elemento radice
  • Tutti i tag DEVONO essere chiusi
  • Case-sensitive (maiuscole/minuscole contano)
  • Nidificazione corretta obbligatoria
  • Attributi sempre tra virgolette

3. Componenti Principali:

  • Dichiarazione XML (prolog)
  • Elementi (tag)
  • Attributi
  • Commenti
  • CDATA per testo speciale

4. Quando Usare XML:

  • Documenti complessi con struttura gerarchica
  • Quando servono namespace
  • File di configurazione
  • Validazione rigorosa necessaria
  • Sistemi legacy o SOAP
💡 Suggerimenti Finali
  • Usa nomi descrittivi: <prezzoTotale> è meglio di <pt>
  • Sii coerente: se usi camelCase, usalo sempre
  • Indenta il codice: rende l'XML molto più leggibile
  • Commenta quando necessario: aiuta chi legge dopo
  • Valida sempre: usa strumenti online o editor con validazione
  • Non esagerare con la profondità: troppi livelli rendono difficile il parsing
  • Considera JSON: per API moderne è spesso la scelta migliore

🎉 Complimenti!

Ora conosci XML dalle basi agli argomenti avanzati! XML è uno strumento potente che continua ad essere usato in tantissimi ambiti.

Continua a sperimentare con l'editor interattivo e prova a creare documenti XML per i tuoi progetti!